iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

大學每日任務:攝取新知識及學習紀錄系列 第 14

預存程序與觸發程序介紹

  • 分享至 

  • xImage
  •  

預存程序(Stored Procedure):
是將複雜的操作,或是常用的查詢指令程式碼先放在資料庫裡,預先儲存指令。等到外部程式呼叫要使用時,就不需要每次都發布一大串的SQL指令,「預存程序」可以降低負荷,提升執行效率。

優點:
提高執行效率、減少網路流量、資加資料安全性、模組化以便重複使用。
缺點:
可攜帶性較差。

建立預存程序

Create Procedure預存程序名稱([參數陣列])
SQL_Statement

要小心()很容易忘記打。

呼叫
Call 預存程序名稱()
https://ithelp.ithome.com.tw/upload/images/20220929/20152201Qt2suuJVls.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201WaH5mIek7I.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201MgHtAzEOQG.png

https://ithelp.ithome.com.tw/upload/images/20220929/201522011PsQerqfSC.png

https://ithelp.ithome.com.tw/upload/images/20220929/201522017rIBA0k7va.png

將程序預先存進資料庫裡,不需要每次都打很長的查詢操作,只要用一行Call呼叫,就能顯示出來。

刪除預存程序
DROP Procedure[IF EXISTS] 預存程序名稱
if exists 為判斷如果存在
https://ithelp.ithome.com.tw/upload/images/20220929/20152201wfQ16jx6GK.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201FaEslPH3r6.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201DRfPXrzpPD.png

觸發程序(TRIGGER)
為一種特殊的預存程序,與需要使用者呼叫的預存程序不同,當資料表有新增、刪除、修改時,這些動作會使得事先設定的預存程序自動執行。
例如:當你使用數位帳戶轉帳時,系統會自動寄送通知到你的電子信箱。

觸發程序分別有兩種時機:

  • Before:作為事前預防,在異動資料前觸發。
  • After:作為事後處理,在異動資料後觸發,檢查是否合乎規定。
CREATE TRIGGER 觸發程序名稱 {BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON BaseTable
FOR EACH ROW
BEGIN
 Sql指令集
END;

先寫出會員異動資料表
https://ithelp.ithome.com.tw/upload/images/20220929/20152201NMo9QC7dSm.png

再建立觸發器
https://ithelp.ithome.com.tw/upload/images/20220929/20152201PtwLrhulWu.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201l6oMG3RzD6.png

https://ithelp.ithome.com.tw/upload/images/20220929/20152201PBBf7tKb9c.png

現在新增一筆資料
https://ithelp.ithome.com.tw/upload/images/20220929/20152201GKAp5XXt2C.png

就會在會員異動資料表看到異動記錄
https://ithelp.ithome.com.tw/upload/images/20220929/201522016fvfsaIedC.png

刪除觸發程序
DROP TRIGGER [IF EXISTS]觸發程序名稱

參考資料:
書籍「動畫圖解資料庫系統理論」。


上一篇
DML的查詢功能
下一篇
PHP連結資料庫
系列文
大學每日任務:攝取新知識及學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言